package cn.zwx.common.canal.schedule;

import cn.zwx.common.canal.service.CanalHandlerService;
import com.alibaba.otter.canal.client.CanalConnector;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Map;

import static cn.zwx.common.canal.constants.CanalConstants.canalConnectorMap;

/**
 * 这里模拟拉取数据
 */
@Component
public class CanalSchedulingJob {

    @Resource
    private CanalHandlerService canalHandlerService;

    /**
     * 模拟定时任务拉取数据
     * <code>
     *     可能存在的问题
     *     使用定时任务触发会存在一个问题 canal server 给到了 node1,node1挂了
     *     此时node1无法给ack xxl-job会调度到node2 再去拉取 在这个过程中会存在问题
     *     1.xxl-job调度到 node2了 canal server 还没有放弃node1 存在数据延迟
     *     2.canal server 判定放弃 node1 需要时间 在过程 产生数据延迟
     * </code>
     */
    @Scheduled(cron="0/5 * * * * ?")
    public void monitorBinlogJob() {
        for (Map.Entry<String, CanalConnector> entry : canalConnectorMap.entrySet()) {
            canalHandlerService.processBinlog(entry.getKey(),entry.getValue());
        }
    }
}
